package br.gov.ibama.client.visao.frequencia;

import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;

import br.gov.ibama.client.AuthService;
import br.gov.ibama.client.AuthServiceAsync;
import br.gov.ibama.client.componentes.BasisComponentes;
import br.gov.ibama.client.constantes.ConstantesDS;
import br.gov.ibama.client.constantes.ConstantesFields;
import br.gov.ibama.client.visao.VisaoPopup;

import com.google.gwt.core.client.GWT;
import com.smartgwt.client.data.Criteria;
import com.smartgwt.client.data.DSCallback;
import com.smartgwt.client.data.DSRequest;
import com.smartgwt.client.data.DSResponse;
import com.smartgwt.client.data.DataSource;
import com.smartgwt.client.data.Record;
import com.smartgwt.client.types.ListGridEditEvent;
import com.smartgwt.client.util.SC;
import com.smartgwt.client.widgets.ImgButton;
import com.smartgwt.client.widgets.events.ClickEvent;
import com.smartgwt.client.widgets.events.ClickHandler;
import com.smartgwt.client.widgets.form.fields.ComboBoxItem;
import com.smartgwt.client.widgets.form.fields.FormItem;
import com.smartgwt.client.widgets.form.fields.events.ChangedEvent;
import com.smartgwt.client.widgets.form.fields.events.ChangedHandler;
import com.smartgwt.client.widgets.grid.ListGrid;
import com.smartgwt.client.widgets.grid.ListGridField;

public class VisaoPopupFrequencia extends VisaoPopup{

	public static final AuthServiceAsync authService = GWT
			.create(AuthService.class);
	
	public VisaoPopupFrequencia(String title) {
		super (title);
	}

	protected List<ImgButton> getBotoes (){
		List<ImgButton> listaBotoes = new ArrayList<ImgButton>();
		listaBotoes.add(getBotaoPesquisar());
		listaBotoes.add(getBotaoCancelar());
		return listaBotoes;
	}
	
	private ImgButton getBotaoPesquisar(){
		ImgButton Salvar = BasisComponentes.criaImgButton("Pesquisar", "pesquisar_48x48.png");
		Salvar.addClickHandler(new ClickHandler() {
			
			@Override
			public void onClick(ClickEvent event) {
				if (validaCampos()) {
					FormItem escola = getFormulario().getItem(ConstantesFields.FIELD_ESCOLA_NOME);
					FormItem disciplina = getFormulario().getItem(ConstantesFields.FIELD_DISCIPLINA_TURMA);
					Criteria criteria = new Criteria();
					criteria.addCriteria(ConstantesFields.FIELD_ESCOLA_ID, escola.getValue().toString());
					criteria.addCriteria(ConstantesFields.FIELD_DISCIPLINA_ID, disciplina.getValue().toString());
					DataSource.get(ConstantesDS.DS_FREQUENCIA).fetchData(criteria, new DSCallback() {
						
						@Override
						public void execute(DSResponse response, Object rawData, DSRequest request) {
							Record[] registros = response.getData();
							if (registros.length > 0) {

								Record registro = registros[0];
								VisaoPopup visao = new VisaoPopupFormularioFrequencia("Frequência");
								visao.redefinirTamanhoJanelaPopUp("450", "930", "880", "430");
								
								String disciplinaId = registro.getAttribute(ConstantesFields.FIELD_FREQUENCIA_DISCIPLINA_ID);
								String mes = registro.getAttribute(ConstantesFields.FIELD_FREQUENCIA_MES);
								Criteria criteria = new Criteria();
								criteria.addCriteria(ConstantesFields.FIELD_FREQUENCIA_DISCIPLINA_ID, disciplinaId);
								criteria.addCriteria(ConstantesFields.FIELD_FREQUENCIA_MES, mes);
								
							    final ListGrid frequenciaGrid = new ListGrid();  
						        frequenciaGrid.setWidth(850);  
						        frequenciaGrid.setHeight(430);  
						        frequenciaGrid.setShowAllRecords(true);  
						        frequenciaGrid.setCellHeight(22);  
						        frequenciaGrid.setCriteria(criteria);
						        frequenciaGrid.setDataSource(DataSource.get(ConstantesDS.DS_FREQUENCIA));  
						  	  
						        ListGridField codigo = new ListGridField(ConstantesFields.FIELD_FREQUENCIA_ID, "Código"); 
						        codigo.setWidth(50);						   
						        ListGridField aluno = new ListGridField(ConstantesFields.FIELD_FREQUENCIA_ALUNO_NOME, "Aluno");
						        aluno.setWidth(150);
						        ListGridField _1 = new ListGridField(ConstantesFields.FIELD_FREQUENCIA_1, "1");
						        ListGridField _2 = new ListGridField(ConstantesFields.FIELD_FREQUENCIA_2, "2");
						        ListGridField _3 = new ListGridField(ConstantesFields.FIELD_FREQUENCIA_3, "3");
						        ListGridField _4 = new ListGridField(ConstantesFields.FIELD_FREQUENCIA_4, "4");
						        ListGridField _5 = new ListGridField(ConstantesFields.FIELD_FREQUENCIA_5, "5");
						        ListGridField _6 = new ListGridField(ConstantesFields.FIELD_FREQUENCIA_6, "6");
						        ListGridField _7 = new ListGridField(ConstantesFields.FIELD_FREQUENCIA_7, "7");
						        ListGridField _8 = new ListGridField(ConstantesFields.FIELD_FREQUENCIA_8, "8");
						        ListGridField _9 = new ListGridField(ConstantesFields.FIELD_FREQUENCIA_9, "9");
						        ListGridField _10 = new ListGridField(ConstantesFields.FIELD_FREQUENCIA_10, "10");
						        ListGridField _11 = new ListGridField(ConstantesFields.FIELD_FREQUENCIA_11, "11");
						        ListGridField _12 = new ListGridField(ConstantesFields.FIELD_FREQUENCIA_12, "12");
						        ListGridField _13 = new ListGridField(ConstantesFields.FIELD_FREQUENCIA_13, "13");
						        ListGridField _14 = new ListGridField(ConstantesFields.FIELD_FREQUENCIA_14, "14");
						        ListGridField _15 = new ListGridField(ConstantesFields.FIELD_FREQUENCIA_15, "15");
						        ListGridField _16 = new ListGridField(ConstantesFields.FIELD_FREQUENCIA_16, "16");
						        ListGridField _17 = new ListGridField(ConstantesFields.FIELD_FREQUENCIA_17, "17");
						        ListGridField _18 = new ListGridField(ConstantesFields.FIELD_FREQUENCIA_18, "18");
						        ListGridField _19 = new ListGridField(ConstantesFields.FIELD_FREQUENCIA_19, "19");
						        ListGridField _20 = new ListGridField(ConstantesFields.FIELD_FREQUENCIA_20, "20");
						        ListGridField _21 = new ListGridField(ConstantesFields.FIELD_FREQUENCIA_21, "21");
						        ListGridField _22 = new ListGridField(ConstantesFields.FIELD_FREQUENCIA_22, "22");
						        ListGridField _23 = new ListGridField(ConstantesFields.FIELD_FREQUENCIA_23, "23");
						        ListGridField _24 = new ListGridField(ConstantesFields.FIELD_FREQUENCIA_24, "24");
						        ListGridField _25 = new ListGridField(ConstantesFields.FIELD_FREQUENCIA_25, "25");
						        ListGridField _26 = new ListGridField(ConstantesFields.FIELD_FREQUENCIA_26, "26");
						        ListGridField _27 = new ListGridField(ConstantesFields.FIELD_FREQUENCIA_27, "27");
						        ListGridField _28 = new ListGridField(ConstantesFields.FIELD_FREQUENCIA_28, "28");
						        ListGridField _29 = new ListGridField(ConstantesFields.FIELD_FREQUENCIA_29, "29");
						        ListGridField _30 = new ListGridField(ConstantesFields.FIELD_FREQUENCIA_30, "30");
						        ListGridField _31 = new ListGridField(ConstantesFields.FIELD_FREQUENCIA_31, "31");
					        
						        frequenciaGrid.setFields(codigo, aluno, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, 
						        		_14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31);  
						  
						        frequenciaGrid.setAutoFetchData(true);  
						        frequenciaGrid.setCanEdit(true);  
						        frequenciaGrid.setEditEvent(ListGridEditEvent.CLICK); 
						        
						        visao.addComponentes(frequenciaGrid);
						        						        								
						        visao.draw();
							} else {
								SC.warn("Não há frequências cadastradas para essa disciplina!");
							}							
						}
					});
				}
			}
		});
		return Salvar;
	}
		
	private ImgButton getBotaoCancelar(){
		ImgButton Cancelar = BasisComponentes.criaImgButton("Cancelar", "cancelar_32x32.png");
		Cancelar.addClickHandler(new ClickHandler() {
			
			@Override
			public void onClick(ClickEvent event) {
				destroy();
				
			}
		});
		return Cancelar;
	}
	
	public void criaFormulario(){
		preparaFormulario(ConstantesDS.DS_FREQUENCIA, getListaCamposFormulario());
	}
	
	public FormItem[] getListaCamposFormulario(){
		return getCamposFormulario().toArray(new FormItem[getCamposFormulario().size()]);
	}
	
	private List<FormItem> getCamposFormulario(){
	
		List<FormItem> listaCampos = new ArrayList<FormItem>();
		
		ComboBoxItem escola = BasisComponentes.criaComboboxObrigatorioGrande(ConstantesFields.FIELD_ESCOLA_NOME, "Nome da Escola");
		escola.setOptionDataSource(DataSource.get(ConstantesDS.DS_ESCOLA));
		escola.setDisplayField(ConstantesFields.FIELD_ESCOLA_NOME);
		escola.setValueField(ConstantesFields.FIELD_ESCOLA_ID);
		escola.addChangedHandler(new ChangedHandler() { 
            public void onChanged(ChangedEvent event) {  
            	getFormulario().clearValue(ConstantesFields.FIELD_DISCIPLINA_TURMA);
            	Integer selectedItem = (Integer) event.getValue(); 
				Criteria criteria = new Criteria();
				criteria.addCriteria(ConstantesFields.FIELD_ESCOLA_ID, selectedItem.toString());
				DataSource.get(ConstantesDS.DS_DISCIPLINA).fetchData(criteria, new DSCallback() {
					
					@Override
					public void execute(DSResponse response, Object rawData, DSRequest request) {
						LinkedHashMap mapaDasDisciplinas = new LinkedHashMap();
						if (!response.getDataAsRecordList().isEmpty() && response.getDataAsRecordList().getLength() > 0) {
							Record[] registros = response.getData();
							for (int i = 0; i < registros.length; i++) {
								Record registro = registros[i];
								String disciplinaID = registro.getAttribute(ConstantesFields.FIELD_DISCIPLINA_ID);
								String disciplinaTurma = registro.getAttribute(ConstantesFields.FIELD_DISCIPLINA_TURMA);
								String disciplinaNome = registro.getAttribute(ConstantesFields.FIELD_DISCIPLINA_NOME);
								mapaDasDisciplinas.put(disciplinaID, disciplinaTurma + " - " + disciplinaNome);
							}
						}
						getFormulario().getField(ConstantesFields.FIELD_DISCIPLINA_TURMA).setValueMap(mapaDasDisciplinas); 	
					}
				});
            }  
        });  
		listaCampos.add(escola);
		
		ComboBoxItem turma_disciplina = BasisComponentes.criaComboboxObrigatorioGrande(ConstantesFields.FIELD_DISCIPLINA_TURMA, "Turma");
		turma_disciplina.setAddUnknownValues(false);
		turma_disciplina.addChangedHandler(new ChangedHandler() { 
            public void onChanged(ChangedEvent event) {  
            	getFormulario().clearValue(ConstantesFields.FIELD_FREQUENCIA_MES);
            	Integer selectedItem = Integer.parseInt(event.getValue().toString()); 
				Criteria criteria = new Criteria();
				criteria.addCriteria(ConstantesFields.FIELD_DISCIPLINA_ID, selectedItem.toString());
				DataSource.get(ConstantesDS.DS_DISCIPLINA).fetchData(criteria, new DSCallback() {
					
					@Override
					public void execute(DSResponse response, Object rawData, DSRequest request) {
						LinkedHashMap<Integer, String> mapaDosMeses = new LinkedHashMap<Integer, String>();
						if (!response.getDataAsRecordList().isEmpty() && response.getDataAsRecordList().getLength() > 0) {
							Record[] registros = response.getData();
							Record registro = registros[0];
							String periodo = registro.getAttribute(ConstantesFields.FIELD_DISCIPLINA_PERIODO);
							if (periodo != null) {
								if (periodo.equals("1")) {
									preencheMapaDosMeses1Semestre(mapaDosMeses);
								} else {
									preencheMapaDosMeses2Semestre(mapaDosMeses);
								}
							} else {
								preencheMapaDosMesesUmAno(mapaDosMeses);
							}
						}
						getFormulario().getField(ConstantesFields.FIELD_FREQUENCIA_MES).setValueMap(mapaDosMeses);						
					}
				});               
            }  
        });  
        listaCampos.add(turma_disciplina);
        
        ComboBoxItem mes = BasisComponentes.criaComboboxObrigatorioGrande(ConstantesFields.FIELD_FREQUENCIA_MES, "Mês");
        mes.setAddUnknownValues(false);
        listaCampos.add(mes);
		
		return listaCampos;		
	}
	
	private boolean validaCampos() {
		FormItem nomeEscola = getFormulario().getItem(ConstantesFields.FIELD_ESCOLA_NOME);
		FormItem turma = getFormulario().getItem(ConstantesFields.FIELD_DISCIPLINA_TURMA);
		FormItem mes = getFormulario().getItem(ConstantesFields.FIELD_FREQUENCIA_MES);
		
		// Verifica preenchimento dos campos obrigatórios
		if (isVazio(nomeEscola) || isVazio(turma) || isVazio(mes)) {
			SC.warn("Há campos obrigatórios não preenchidos.");
			return false;
		}
		return true;
	}
	
	protected boolean isVazio(FormItem item){
		return item == null || item.getValue() == null || item.getValue().toString().equals("");	
	}
	
	private void preencheMapaDosMesesUmAno(LinkedHashMap<Integer, String> mapaDosMeses) {
		mapaDosMeses.put(1, "Janeiro");
		mapaDosMeses.put(2, "Fevereiro");
		mapaDosMeses.put(3, "Março");
		mapaDosMeses.put(4, "Abril");
		mapaDosMeses.put(5, "Maio");
		mapaDosMeses.put(6, "Junho");
		mapaDosMeses.put(7, "Julho");
		mapaDosMeses.put(8, "Agosto");
		mapaDosMeses.put(9, "Setembro");
		mapaDosMeses.put(10, "Outubro");
		mapaDosMeses.put(11, "Novembro");
		mapaDosMeses.put(12, "Dezembro");
	}
	
	private void preencheMapaDosMeses1Semestre(LinkedHashMap<Integer, String> mapaDosMeses) {
		mapaDosMeses.put(1, "Janeiro");
		mapaDosMeses.put(2, "Fevereiro");
		mapaDosMeses.put(3, "Março");
		mapaDosMeses.put(4, "Abril");
		mapaDosMeses.put(5, "Maio");
		mapaDosMeses.put(6, "Junho");
	}
	
	private void preencheMapaDosMeses2Semestre(LinkedHashMap<Integer, String> mapaDosMeses) {
		mapaDosMeses.put(7, "Julho");
		mapaDosMeses.put(8, "Agosto");
		mapaDosMeses.put(9, "Setembro");
		mapaDosMeses.put(10, "Outubro");
		mapaDosMeses.put(11, "Novembro");
		mapaDosMeses.put(12, "Dezembro");
	}
}
